# 20. 有效的括号
# 提示
# 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。
#
# 有效字符串需满足：
#
# 左括号必须用相同类型的右括号闭合。
# 左括号必须以正确的顺序闭合。
# 每个右括号都有一个对应的相同类型的左括号。
def is_valid(s: str) -> bool:
    """
    :type s: str
    :rtype: bool
    """
    # 长度为1
    if len(s) < 2:
        return False
    # 设置好括号的映射关系
    bracket_dict = {')': '(', ']': '[', '}': '{'}
    # 使用栈的方式实现
    brakcet_stack = []
    for ch in s:
        # ch 为左括号
        if ch not in bracket_dict:
            # 把元素放到最后面
            brakcet_stack.append(ch)
        else:
            # ch 为右括号，找到对应的左括号
            left_brakcet = bracket_dict[ch]
            # 弹出一个括号（最后一个元素），是否能匹配
            if not brakcet_stack or left_brakcet != brakcet_stack[-1]:
                return False
    return not brakcet_stack


print(is_valid('()'))
print(is_valid(')('))
print(is_valid('()[]{}'))
print(is_valid('(]'))
print(is_valid('([)]'))
print(is_valid('{[]}'))
print(is_valid('{[({})]}'))
